package com.leyou.page.service;

import com.leyou.client.item.ItemClient;
import com.leyou.item.dto.SpecGroupDTO;
import com.leyou.item.dto.SpuDTO;
import com.leyou.item.pojo.Brand;
import com.leyou.item.pojo.Category;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 商品详情业务
 */
@Service
public class PageService {
    @Autowired
    private ItemClient itemClient;
    @Value("${ly.static.itemTemplate}")
    private String itemTemplate; //静态目标名称
    @Value("${ly.static.itemDir}")
    private String itemDir; //静态页面存储路径
    @Autowired
    private SpringTemplateEngine templateEngine;//模板引擎

    public Map<String,Object> pageDetail(Long id) {
        //1.定义Map集合，用于封装所有页面需要的数据
        Map<String,Object> resultMap = new HashMap<>();

        //2.查询并封装数据
        //2.1 根据spuId查询SpuDTO
        SpuDTO spuDTO = itemClient.findSpuById(id);

        //2.2 根据id集合查询分类集合
        List<Category> categoryList = itemClient.findCategoriesByIds(Arrays.asList(spuDTO.getCid1(), spuDTO.getCid2(), spuDTO.getCid3()));

        //2.3 根据id查询品牌
        Brand brand = itemClient.findBrandById(spuDTO.getBrandId());

        //2.4 根据分类id查询规格组
        List<SpecGroupDTO> specGroupDTOS = itemClient.findSpecGroupDtoByCid(spuDTO.getCid3());

        //3.把查询的数据封装到resultMap中，并返回

        resultMap.put("categories",categoryList);
        resultMap.put("brand",brand);
        resultMap.put("spuName",spuDTO.getName());
        resultMap.put("subTitle",spuDTO.getSubTitle());
        resultMap.put("detail",spuDTO.getSpuDetail());
        resultMap.put("skus",spuDTO.getSkus());
        resultMap.put("specs",specGroupDTOS);
        return resultMap;
    }

    /**
     * 生成商品详情静态页
     */
    public void createStaticPage(Long spuId){
        //1.创建Context对象
        Context context = new Context();
        //设置动态数据
        context.setVariables(this.pageDetail(spuId));

        //2.读取静态目标页面（默认会到resources/templates/目录下读取该模板页面）
        String templatePage = itemTemplate+".html";

        //3.使用模板引擎把Context数据写入静态模板中，最终生成一个静态页面
        //3.1 定义文件输出流
        PrintWriter writer = null;
        try {
            writer = new PrintWriter(new File(itemDir+"/"+spuId+".html"));

            //3.2 使用模板引擎写出静态页面
            templateEngine.process(templatePage,context,writer);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            //注意：必须记得关闭输出流，否则后面无法删除该页面
            writer.close();
        }

    }

    public void deleteStaticPage(Long spuId) {
        //1.读取文件
        //1.1 获取文件所在地理路径
        //1.2 获取文件
        String fileName = spuId+".html";
        File file = new File(itemDir,fileName);

        //2删除文件
        if(file.exists()){
            file.delete();
        }
    }
}
